Generieke collecties
Inleiding
Generics zijn nieuw in C# 2.0. En ze zijn een zegen. Want een ArrayList
is een type waarin allerlei objecten geplaatst kunnen worden. Het maakt niet uit wat voor soort object je erin plaatst. Het kan een lijst van boeken, klanten of van god weet beter zijn. Doordat je er van alles in kan plaatsen is het in de lijst plaatsen van objecten en ze er weer uithalen zeer traag. Dat komt door het mechanisme van boxing en unboxing Dat in- en uitpakken van objecten kost tijd en geheugen. Bovendien moet je het generieke object dat in de lijst staat converteren naar het type dat je wilt gebruiken.
Een derde nadeel is het gebrek aan typegevoeligheid in lijsten zoals ArrayList
. De compiler is in staat om een object naar ieder type te converteren. De volgende code vindt de compiler prima:
ArrayList lijst = new ArrayList(); string naam = "Debbie"; lijst.Add(naam); int leeftijd = (int)lijst[0];
Tijdens de uitvoering van die code loopt het mis. De waarde “Debbie” kan immers niet geconverteerd worden naar een getal. Generics zijn typeveilig.
Met Generics biedt C# 2.0 een nieuwe mogelijkheid. Je kan een eigen lijst-klasse maken zonder te moeten casten, het type te checken en boxing van het object toe te passen.
De ingebouwde List
generieke klasse
De List generieke klasse is standaard in het .NET ingebouwd. Microsoft raadt aan die klasse te gebruiken i.p.v. je eigen klasse te maken. Om de List klasse te kunnen gebruiken moet je volgende directive gebruiken:
using System.Collections.Generic;
Publieke eigenschappen
Zie MSDN.
Voorbeeld
In het voorbeeld zie je een element kan toevoegen, deleten, een reeks kan toevoegen, ordenen, tellen, enz...
// Dit voorbeeld illustreert het gebruik van de List generieke klasse. // Eigenschappen en methoden van List generieke klasse. public static string GenericListSimpleExample() { StringBuilder sb = new StringBuilder(); List<string> dinosaurs = new List<string>(); sb.AppendLine(string.Format("\nCapacity: {0}", dinosaurs.Capacity)); // Elementen toevoegen aan het einde van de lijst dinosaurs.Add("Tyrannosaurus"); dinosaurs.Add("Amargasaurus"); dinosaurs.Add("Mamenchisaurus"); dinosaurs.Add("Deinonychus"); dinosaurs.Add("Compsognathus"); sb.AppendLine(); foreach (string dinosaur in dinosaurs) { sb.AppendLine(dinosaur); } // statistics sb.AppendLine(string.Format("\nCapacity: {0}", dinosaurs.Capacity)); sb.AppendLine(string.Format("Count: {0}", dinosaurs.Count)); // zit een bepaald element in de lijst? sb.AppendLine(string.Format("\nContains(\"Deinonychus\"): {0}", dinosaurs.Contains("Deinonychus"))); // Een rij toevoegen op een bepaalde positie in de lijst sb.AppendLine(string.Format("\nInsert(2, \"Compsognathus\")")); dinosaurs.Insert(2, "Compsognathus"); sb.AppendLine(); foreach (string dinosaur in dinosaurs) { sb.AppendLine(dinosaur); } sb.AppendLine(string.Format("\ndinosaurs[3]: {0}", dinosaurs[3])); // Een rij verwijderen sb.AppendLine("\nRemove(\"Compsognathus\")"); dinosaurs.Remove("Compsognathus"); sb.AppendLine(); foreach (string dinosaur in dinosaurs) { sb.AppendLine(dinosaur); } // reorganiseert de lijst, lege (gedelete) plaatsen worden verwijderd sb.AppendLine("\nStats voor TrimExcess()"); sb.AppendLine(string.Format("Capacity: {0}", dinosaurs.Capacity)); sb.AppendLine(string.Format("Count: {0}", dinosaurs.Count)); dinosaurs.TrimExcess(); sb.AppendLine("\nStats na TrimExcess()"); sb.AppendLine(string.Format("Capacity: {0}", dinosaurs.Capacity)); sb.AppendLine(string.Format("Count: {0}", dinosaurs.Count)); // ordenen sb.AppendLine("\nGeordend op naam"); dinosaurs.Sort(); foreach (string dinosaur in dinosaurs) { sb.AppendLine(dinosaur); } // voeg een reeks toe, het zijn wel geen dino's, maar // dat maakt niet veel uit // let erop dat die niet geordend zijn String[] names = { "Samuel", "Dakota", "Koani", "Saya", "Vanya", "Yiska", "Yuma", "Jody", "Nikita" }; dinosaurs.AddRange(names); sb.AppendLine("\nReeks namen toegevoegd"); foreach (string dinosaur in dinosaurs) { sb.AppendLine(dinosaur); } // lijst leegmaken dinosaurs.Clear(); sb.AppendLine("\nClear()"); sb.AppendLine(string.Format("Capacity: {0}", dinosaurs.Capacity)); sb.AppendLine(string.Format("Count: {0}", dinosaurs.Count)); return sb.ToString(); }
En we proberen de methode uit in de Main methode van de Program klasse in Program.cs:
using System; namespace DotNetCore.Learning { class Program { static void Main(string[] args) { //Console.WriteLine(TryOut.ReadFromCSVFile()); //TryOut.ArrayListSample(); //TryOut.DictionarySample(); Console.WriteLine(TryOut.GenericListSimpleExample()); Console.ReadKey(); } } }